//
//  UITextView+Extension.swift
//  微博
//
//  Created by 霸气的刘吉庆 on 16/4/30.
//  Copyright © 2016年 ios. All rights reserved.
//

import UIKit

extension UITextView {
    
    //将表情图片转成表情字符串以发送到新浪微博
    
    var emoticonText: String? {
        var result = ""
        let attr = self.attributedText
        //遍历富文本里面的内容
        /*参数的含义
        1.遍历的范围
        2.参数
        3.使用的block,里面带有我们可能需要的参数,
         3.1 字典
         3.2 范围
         3.3 bool指针,相当于stop *stop
        
        
        
        */
//        attr.enumerateAttributesInRange(<#T##enumerationRange: NSRange##NSRange#>, options: <#T##NSAttributedStringEnumerationOptions#>, usingBlock: <#T##([String : AnyObject], NSRange, UnsafeMutablePointer<ObjCBool>) -> Void#>)
        attr.enumerateAttributesInRange(NSMakeRange(0, attr.length), options: []) { (dict, range, _) -> Void in
            if let atta = dict["NSAttachment"] as? CZTextAttachment {
                //是表情的字符串,对应的键值就是attachment,只有这个类才能存储对应的值
                result += atta.emoticon?.chs ?? ""
                
            }else{
                //代表不是表情,是文字,这个是根据range截取对应的字符串,所以没什么问题的
                //注意这个是nsstring的方法,返回的却是string类型的
                result += (attr.string as NSString).substringWithRange(range)
                
            }
        }
       return result
    }
    
    //添加一个表情到当前的textView中
    //class 代表的是类方法
    func insert(emoticon: CZEmoticonModel){
        //创建一个NSMutableString
        let attr = NSMutableAttributedString(attributedString: self.attributedText)
        
        //创建image
        let image = UIImage(named: "\(emoticon.folderName ?? "")/\(emoticon.png ?? "")", inBundle: CZEmoticonKeyBoardViewModel.sharedViewModel.emoticonBundle, compatibleWithTraitCollection: nil)
        
        //创建attach
        let attach = NSTextAttachment()
        attach.image = image
        //设置图片的大小
        let attachmentWH = self.font!.lineHeight
        attach.bounds = CGRect(x: 0, y: -4, width: attachmentWH, height: attachmentWH)
        //转换成字符串
        let attributeString = NSAttributedString(attachment: attach)
        
        //添加到mutableString里面
        //添加到原文本里面,如果直接使用append会把文本添加到最后面,所以我们的需求就是讲内容添加到选中的位置,选中的可能是单个位置,也有可能是一串位置
        //        attr.appendAttributedString(attributeString)
        //设置attr的属性
        //获取当前的位置
        var selectedRanage = self.selectedRange
        //替换选中的位置的内容
        attr.replaceCharactersInRange(selectedRanage, withAttributedString: attributeString)
        //这里注意就是self.font!需要强行解包
        
        attr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, attr.length))
        //将内容赋值给self
        self.attributedText = attr
        //设置光标的位置
        selectedRanage.location += 1
        selectedRanage.length = 0
        self.selectedRange = selectedRanage
        
        //发送文字改变的通知
        //这个是改变占位符的状态
        
        NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
        //调用文字改变的代理方法
        //这个代理方法是系统自带的,里面主要是改变navigation里面的按钮的状态
        //上面已经代替了,这里不需要传入什么
        delegate?.textViewDidChange?(self)

    }
    
    
}
